typedef struct Nodito{
			unsigned int id;
			string nombre;
			posicion puntero;
};

template <class T>
class Archivo{
		private:
			ArbolBin<Nodito> indice;
			Lista<T> maestro;
			void cargarIndice(Nodito);
			void print(Nodo<Nodito>*);
		public:
			Archivo();
			int obtenerProximoId();
			void agregarElemento(T);
			void eliminarElemento(T);
			T buscarElemento(string);
			void modificarDato(T);
			void imprimir();
			void vaciarArchivo();
};
template <class T>
Archivo<T>::Archivo(){
	indice.talar();
	maestro.vaciar();
};
template <class T>
int Archivo<T>::obtenerProximoId(){
		return maestro.cantidad()+1;
}
template <class T>
void Archivo<T>::agregarElemento(T elemento){
			 posicion p = maestro.fin();
			 maestro.insertar(elemento,maestro.fin());
			 Nodito nodo;
			 nodo.id=elemento.getId();
			 nodo.nombre=elemento.getNombre();
			 nodo.puntero=p;
			 cargarIndice(nodo);
};
template <class T>
void Archivo<T>::cargarIndice(Nodito nodo){
		Nodo<Nodito>** raiz = indice.raizArbol();
		while(*raiz!=NULL){
				 if(indice.recuperar(*raiz).nombre>nodo.nombre)
							raiz=indice.hijoIzq(*raiz);
				 else
							raiz=indice.hijoDer(*raiz);
		}
		indice.asignarNodo(nodo,*raiz);
};
template <class T>
void Archivo<T>::eliminarElemento(T elemento){};

template <class T>
void Archivo<T>::modificarDato(T elemento){
		string nombre;
		nombre=elemento.getNombre();

		Nodo<Nodito>** raiz = indice.raizArbol();
		T	temp;
		while(*raiz!=NULL && indice.recuperar(*raiz).nombre!=nombre){
				 if(indice.recuperar(*raiz).nombre>nombre)
							raiz=indice.hijoIzq(*raiz);
				 else
							raiz=indice.hijoDer(*raiz);
		}
		if(*raiz!=NULL)
				maestro.modificarDato(indice.recuperar(*raiz).puntero, elemento);
};
template <class T>
T Archivo<T>::buscarElemento(string nombre){
		Nodo<Nodito>** raiz = indice.raizArbol();
		T	temp;
		while(*raiz!=NULL && indice.recuperar(*raiz).nombre!=nombre){
				 if(indice.recuperar(*raiz).nombre>nombre)
							raiz=indice.hijoIzq(*raiz);
				 else
							raiz=indice.hijoDer(*raiz);
		}
		return (*raiz==NULL?temp:maestro.recuperar(indice.recuperar(*raiz).puntero));
};
template <class T>
void Archivo<T>::imprimir(){
	print(*indice.raizArbol());
};
template <class T>
void Archivo<T>::print(Nodo<Nodito> * nodo){
	 if(nodo!=NULL){
			print(*indice.hijoIzq(nodo));
			maestro.recuperar(indice.recuperar(nodo).puntero).imprimir();
			getch();
			print(*indice.hijoDer(nodo));
	 }
};
template <class T>
void Archivo<T>::vaciarArchivo(){
	indice.talar();
	maestro.vaciar();
};
